#encoding:utf-8
import json
import re
import tqdm
import configparser
from langchain_openai.chat_models import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate


config = configparser.ConfigParser()
config.read('./conf.ini',encoding='utf-8')
llm_config = config['llm_config']
openai_api_key = llm_config['openai_api_key']
openai_api_base = llm_config['openai_api_base']
conf_model = llm_config['conf_model']
model = ChatOpenAI(openai_api_key=openai_api_key,openai_api_base=openai_api_base,model=conf_model)

step1_config = config['step1']
inputfile = step1_config['inputfile']
outputfile = step1_config['outputfile']


def get_extract_onefile(title,abstract):
    system_template = '''
你是一个科技术语抽取的专业人员，请遵循以下指令来工作。
### 指令：
从给定的论文标题和摘要中提取出与科学技术相关的关键词。
抽取过程中注意以下事项：
1.尽可能的抽取长词。
2.输出严格按照样例的格式。
3.仅参考样例的格式，不受到样例内容的影响。
以下是两个案例：
案例1：
### 输入：
标题： "深度学习在医学影像中的应用"
摘要： "本文全面回顾了深度学习技术在医学影像中的应用。我们讨论了各种架构，如卷积神经网络（CNNs）和生成对抗网络（GANs），以及它们在诊断、治疗规划和预后中的应用。研究还探讨了该领域的挑战和机遇，包括数据隐私、模型可解释性和实时处理。"
### 输出：
1. 深度学习
2. 医学影像
3. 卷积神经网络（CNNs）
4. 生成对抗网络（GANs）
5. 诊断
6. 治疗规划
7. 预后
8. 数据隐私
9. 模型可解释性
10. 实时处理
案例2：
### 输入：
标题： "基于Transformer的图像分割技术研究"
摘要： "本文提出了一种基于Transformer架构的图像分割方法。通过自注意力机制，该方法能够有效地捕捉图像中的全局和局部特征。实验结果表明，该方法在分割精度和计算效率方面均优于传统方法。此外，我们还探讨了模型的可扩展性和实时应用能力。"
### 输出：
1. 计算机视觉
2. 图像分割技术
3. Transformer架构
4. 自注意力机制
5. 分割精度
6. 计算效率
7. 模型可扩展性
8. 实时应用能力

以下是我的输入：
### 输入：
标题： {title}
摘要： {abstract}

### 输出：
    '''
    prompt_template = ChatPromptTemplate.from_messages(
        [("system", system_template), ("user", "标题：{title}"), ("user", "摘要：{abstract}")]
    )
    parser = StrOutputParser()
    chain = prompt_template | model | parser
    response = chain.invoke({"title": title,"abstract":abstract})
    return response

def get_extract(title,abstract):
    system_template = '''
你是一个科技术语抽取的专业人员，请遵循以下指令来工作。
### 指令：
从给定的论文标题和摘要中提取出与科学技术相关的关键词。
抽取过程中注意以下事项：
1.尽可能的抽取长词。
2.输出严格按照样例的格式。
3.仅参考样例的格式，不受到样例内容的影响。
以下是两个案例：
案例1：
### 输入：
标题： "深度学习在医学影像中的应用"
摘要： "本文全面回顾了深度学习技术在医学影像中的应用。我们讨论了各种架构，如卷积神经网络（CNNs）和生成对抗网络（GANs），以及它们在诊断、治疗规划和预后中的应用。研究还探讨了该领域的挑战和机遇，包括数据隐私、模型可解释性和实时处理。"
### 输出：
深度学习;医学影像;卷积神经网络（CNNs）;生成对抗网络（GANs）;诊断;治疗规划;预后;数据隐私;模型可解释性;实时处理
案例2：
### 输入：
标题： "基于Transformer的图像分割技术研究"
摘要： "本文提出了一种基于Transformer架构的图像分割方法。通过自注意力机制，该方法能够有效地捕捉图像中的全局和局部特征。实验结果表明，该方法在分割精度和计算效率方面均优于传统方法。此外，我们还探讨了模型的可扩展性和实时应用能力。"
### 输出：
计算机视觉;图像分割技术;Transformer架构;自注意力机制;分割精度;计算效率;模型可扩展性;实时应用能力

以下是我的输入：
### 输入：
标题： {title}
摘要： {abstract}

### 输出：
    '''
    prompt_template = ChatPromptTemplate.from_messages(
        [("system", system_template), ("user", "标题：{title}"), ("user", "摘要：{abstract}")]
    )
    parser = StrOutputParser()
    chain = prompt_template | model | parser
    response = chain.invoke({"title": title,"abstract":abstract})
    return response


def process_file(inputfile, outputfile):
    with open(inputfile, 'r', encoding='utf-8') as infile, open(outputfile, 'w', encoding='utf-8') as outfile:
        for line in tqdm.tqdm(infile):
            title, abstract = line.strip().split('\t',1)
            keywords = get_extract(title, abstract)
            outfile.write(keywords + '\n')


if __name__ == '__main__':
    # title = '不同强度有氧运动对脑卒中患者凝血功能的影响'
    # abstract = '目的 检测不同强度有氧训练前后脑卒中患者凝血六项,探讨不同强度有氧运动对脑卒中凝血功能的影响.方法 收集2015年1月至2016年12月在重庆市肿瘤医院脑外科初发脑卒中患者120例,根据心肺运动试验,结合随机数字表法将患者分为中强度有氧运动组、低强度有氧运动组及对照组.对照组维持神经内科初发脑卒中基本药物等治疗,中强度有氧运动组、低强度有氧运动组在对照组基础上,以不同强度踩踏功率自行车进行训练.分析比较3组间运动训练前后凝血六项[血浆纤维蛋白原(FIB)、D-二聚体(D-D)、活化部分凝血活酶时间(APTT)、凝血酶原时间(PT)、国际标准化比值(INR)和凝血酶时间(TT)]指标的差异.结果 结果显示3组间运动训练前凝血指标差异无统计学意义(P>0.05).中强度组运动训练后FIB、D-D水平显著低于训练前,低强度组运动训练后仅有FIB水平显著低于训练前,且差异具有统计学意义(P<0.05);中强度组、低强度组其余指标运动前后差异无统计学意义(P>0.05).对照组基础治疗前后各凝血指标差异无统计学意义(P>0.05).运动训练后,中强度组FIB水平显著低于低强度组,而低强度组显著低于对照组,且差异具有统计学意义(P<0.05).结论 中、低强度有氧运动可在一定程度上影响脑卒中患者凝血功能,其中中强度有氧运动更为显著,为临床科学、个体化有氧运动结合药物防治脑卒中再发提供了科学依据.'
    # tag = get_extract(title,abstract)
    print('正在读取输入文件{}'.format(inputfile))
    process_file(inputfile,outputfile)
    print('结果已存储至{}'.format(outputfile))

